package page;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

import ressource.CadreAnnonce;
import ressource.CadreProduit;
import ressource.CadreVendeur;
import ressource.Message;

/**
 * Servlet implementation class VueAnnonce
 */
public class VueAnnonce extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public VueAnnonce() {
        super();
        // TODO Auto-generated constructor stub
    }
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		Integer membre = (Integer)session.getAttribute("user_id");
		
		String sid = request.getParameter("annonce");
		int id = 0;
		Connection con = null;
		
		//Les 3 objets que l'on crée et qui nous serviront pour l'affichage :
		CadreAnnonce a;
		CadreProduit p;
		CadreVendeur v;
		if(sid != null){
			try{
				id = Integer.parseInt(sid);
				
				try{
					Context namingContext = new InitialContext();
					DataSource dataSource = (DataSource)namingContext.lookup("java:comp/env/jdbc/MiniIBay");
					con = dataSource.getConnection();
					
					PreparedStatement pstmt=con.prepareStatement("SELECT a.id_vendeur, a.etat, a.prix, a.commentaire, a.date_creation, a.date_expiration, a.stock, tp.nom, p.intitule, p.description, p.photo, v.pseudo, v.date_creation, v.note, v.nb_ventes, v.avatar FROM `produit` p , `type_produit` tp, `annonce` a, `membre` v WHERE a.id_annonce = ? AND p.id_produit = a.id_produit AND p.id_type = tp.id_type AND a.id_vendeur = v.id_membre");
					pstmt.setInt(1, id);
					
					ResultSet rs = pstmt.executeQuery();
					Integer owner = 0;
					
					if(rs.next()) {
						//On crée le produit :
						p = new CadreProduit();
						p.setType(rs.getString("nom"));
						p.setIntitule(rs.getString("intitule"));
						p.setDescription(rs.getString("description"));
						p.setPhoto(rs.getString("photo"));
						request.setAttribute("produit", p);
						
						//On crée l'annonce :
						a = new CadreAnnonce();
						a.setIdAnnonce(id);
						a.setPrix(rs.getFloat("prix"));
						a.setEtat(rs.getString("etat"));
						a.setCommentaire(rs.getString("commentaire"));
						a.setStock(rs.getInt("stock"));
						a.setDateCreation(rs.getTimestamp("date_creation"));
						a.setDateExpiration(rs.getDate("date_expiration"));
						request.setAttribute("annonce", a);
						
						//On caste la date du vendeur :
						
						DateFormat formatter ; 
				        Date date;
				          
				        formatter = new SimpleDateFormat("yyyy-MM-dd");
				        date = (Date)formatter.parse(rs.getString("date_creation").substring(0, 10)); 
				        
						//On crée le vendeur :
						v = new CadreVendeur();
						v.setIdVendeur(rs.getInt("id_vendeur"));
						owner = rs.getInt("id_vendeur");
						v.setPseudo(rs.getString("pseudo"));
						v.setNote(rs.getFloat("note"));
						v.setNbVentes(rs.getInt("nb_ventes"));
						v.setDateCreation(date);
						if(rs.getString("avatar") != null)
							v.setAvatar(rs.getString("avatar"));
						else
							v.setAvatar("null");
						request.setAttribute("vendeur", v);
						
						rs.close();
					}
					
					//Maintenant nous gérons le dialogue autour de l'annonce si il y en a un :
					pstmt=con.prepareStatement("SELECT u.avatar, m.id_message, m.date, m.message, u.pseudo, u.id_membre FROM message_annonce m, membre u WHERE m.id_annonce = ? AND m.id_membre = u.id_membre ORDER BY m.date ASC");
					pstmt.setInt(1, id);
					
					rs = pstmt.executeQuery();
					
					//Les objets qui vont nous servir :
					Message m;
					List<Message> messages = new ArrayList<Message>();
					while(rs.next()) {
						m = new Message();
						m.setDate(rs.getTimestamp("date"));
						m.setMessage(rs.getString("message"));
						m.setPseudoMembre(rs.getString("pseudo"));
						m.setIdAuteur(rs.getInt("id_membre"));
						m.setIdMessage(rs.getInt("id_message"));
						m.calculeCouleur(owner);
						m.setAvatarMembre(rs.getString("avatar"));
						messages.add(m);
						
						if(membre != null){
							//Est ce que ce message est déjà noté comme lu ?
							PreparedStatement testLu = con.prepareStatement("SELECT id_message FROM message_annonce_vu WHERE id_message = ? AND id_membre = ?");
							testLu.setInt(1, rs.getInt("id_message"));
							testLu.setInt(2, membre);
							ResultSet resultTestLu = testLu.executeQuery();
							if(!resultTestLu.next()) {
								//Ajoutons les messages non lus aux messages lus :
								PreparedStatement setLu = con.prepareStatement("INSERT INTO message_annonce_vu (id_message, id_membre) VALUES (?,?)");
								setLu.setInt(1, rs.getInt("id_message"));
								setLu.setInt(2, membre);
								setLu.executeUpdate();
								setLu.close();
							}
						}
					}
					request.setAttribute("messages", messages);
									
				} catch(SQLException e) {
					System.out.println("Erreur SQL : "+e);
					e.printStackTrace();
				}
				catch(Exception e){
					System.out.println("Erreur : "+e);
				}
				finally {
					con.close();
				}
				
				RequestDispatcher dis=request.getRequestDispatcher("annonce.jsp");
				dis.forward(request,response);
			}catch(Exception e){
				e.printStackTrace();
			} finally {
				try {
					if(con != null) con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} else
			System.out.println("Erreur pour avoir l'id de l'annonce");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
